home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / util / misc / ddli2_02.lha / fpdio.c < prev    next >
C/C++ Source or Header  |  1993-03-01  |  3KB  |  123 lines

  1. /* FPDIO.C Copyright (C) 1993 Fergus Patrick Duniho */
  2.  
  3. #ifndef _FPDIO_C
  4. #define _FPDIO_C
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdarg.h>
  9.  
  10. #define RdOpen(X,Y) X=FDOpen(Y, "r")
  11. #define WrOpen(X,Y) X=FDOpen(Y, "w")
  12. #define ApOpen(X,Y) X=FDOpen(Y, "a")
  13.  
  14. void wrapwrite (FILE *fptr, int ind, int lm, int rm, char *s, ...);
  15. int wrdlen(char *s);
  16. int fgetp (FILE *fptr);
  17. FILE *FDOpen (const char *fn, const char *mode);
  18. int Linefeeds (char *fname);
  19. char *clone_line (FILE *fptr, int max);
  20.  
  21. void wrapwrite (FILE *fptr, int ind, int lm, int rm, char *s, ...) {
  22.     va_list ap;
  23.     int i, j, l;
  24.  
  25.     va_start(ap, s);
  26.     for (j = ind; ; j = lm) {
  27.         for (i = 0; i < j; i++)
  28.             fputc (' ', fptr);
  29.         for (i = j; i < rm; i++)
  30.             switch (*s) {
  31.                 case '\0':     /* End of string reached */
  32.                     if (*(s = va_arg(ap, char *)) == '\0') {
  33.                         fputc ('\n', fptr);
  34.                         va_end(ap);
  35.                         return;
  36.                     }
  37.                     if ((i + wrdlen(s)) >= rm)
  38.                         i = rm;
  39.                     else if (i > j)
  40.                         fputc (' ', fptr);
  41.                     break;
  42.                 case ' ':     /* End of word reached */
  43.                     if ((i + wrdlen(++s)) >= rm)
  44.                         i = rm;
  45.                     else if (i > j)
  46.                         fputc (' ', fptr);
  47.                     break;
  48.                 case '\n':    /* End of line reached */
  49.                     i = rm;
  50.                     s++;
  51.                     break;
  52.                 default:
  53.                     fputc (*s++, fptr);
  54.             }
  55.         fputc ('\n', fptr);
  56.         if ((*s == '\0') && (*(s = va_arg(ap, char *)) == '\0')) {
  57.             va_end(ap);
  58.             return;
  59.         }
  60.     }
  61. }
  62.  
  63. int wrdlen(char *s) {
  64.     int r;
  65.  
  66.     for (r = 0; *s != ' ' && *s != '\n' && *s != '\0'; r++, s++);
  67.     return r;
  68. }
  69.  
  70. int fgetp (FILE *fptr) {
  71.     int c, tot = 0;
  72.  
  73.     while (!isdigit(c = getc(fptr)))
  74.         if (c == EOF)
  75.             return EOF;
  76.     do {
  77.         tot *= 10;
  78.         tot += (c - '0');
  79.     } while (isdigit(c = getc(fptr)));
  80.     if (c != '\n')
  81.         ungetc (c, fptr);
  82.     return tot;
  83. }
  84.  
  85. FILE *FDOpen (const char *fn, const char *mode) {
  86.     FILE *fptr;
  87.  
  88.     if ((fptr = fopen(fn, mode)) == NULL) {
  89.         fprintf (stderr, "Could not open %s.", fn);
  90.         exit (2);
  91.     }
  92.     return fptr;
  93. }
  94.  
  95. int Linefeeds (char *fname) {
  96.     FILE *fptr;
  97.     int c, cnt = 0;
  98.  
  99.     RdOpen (fptr, fname);
  100.     while ((c = getc(fptr)) != EOF)
  101.         if (c == '\n')
  102.             cnt++;
  103.     fclose (fptr);
  104.     return cnt;
  105. }
  106.  
  107. char *clone_line (FILE *fptr, int max) {
  108.     char *s, *r, *t;
  109.     int i;
  110.  
  111.     s = (char *)malloc(max + 1);
  112.     t = s;
  113.     for (i = 0; (i < max) && ((*s = fgetc(fptr)) != '\n'); i++, s++);
  114.     if (*s != '\n')
  115.         ungetc(*s, fptr);
  116.     *s = '\0';
  117.     r = strdup(t);
  118.     free (t);
  119.     return r;
  120. }
  121.  
  122. #endif /* _FPDIO_C */
  123.